#include "cyclelist.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//创建空的循环链表
linknode_t *Cyclelist_create(void)
{
    linknode_t *head = (linknode_t *)malloc(sizeof(linknode_t)); //开辟头节点的空间
    memset(head, 0, sizeof(linknode_t));
    head->next = head;
    return head;
}

//尾插入法
int Cyclelist_insert_tail(linknode_t *head, data_t value)
{
    linknode_t *temp = head;                                     //temp临时记录头节点
    linknode_t *node = (linknode_t *)malloc(sizeof(linknode_t)); //开辟新节点的空间
    node->data = value;
    node->next = head;

    while (head->next != temp)
        head = head->next; //head向后移动一个节点
                           //结束循环时，head指向最后一个节点
    head->next = node;     //最后一个节点与新节点相连

    return 0;
}

//遍历
int Cyclelist_show(linknode_t *head)
{
    linknode_t *temp = head; //temp临时记录头节点

    while (head->next != temp)
    {
        head = head->next;
        printf("%d  ", head->data);
    }
    putchar(10);
    return 0;
}

// 证明我是循环链表
int Cyclelist_show_Prove(linknode_t *head, int cnt)
{
    while (cnt)
    {
        printf("%d  ", head->data);
        head = head->next;
        cnt--;
    }
    putchar(10);
    return 0;
}

//砍掉头节点
linknode_t *Cyclelist_cut_head(linknode_t *head)
{
    linknode_t *temp = head;
    while (head->next != temp)
        head = head->next; //结束循环时head指向最后一个节点

    head->next = temp->next; //最后一个节点与第一个节点相连，把头隔开

    free(temp);
    temp = NULL;

    return head->next; //返回新的头(第一个节点的地址)
}

//无头的遍历
int Cyclelist_show_nohead(linknode_t *head)
{
    linknode_t *temp = head;

    while (head->next != temp)
    {
        printf("%d  ", head->data); //结束循环时head指向最后一个节点
        head = head->next;
    }

    printf("%d\n", head->data);
    return 0;
}
